<?php
/**
 * Acl 权限控制
 */
class Acl
{
	/**
     * 预定义角色常量
     */
	const NOBODY      = 1;    
    const EVERYONE    = 2;
    const NO_ROLE     = 3;
    const HAS_ROLE    = 4;
    const G_ALL       = 5;

    /**
     * Acl 资源信息
     * 
     * @var array
     */
    private $config;
	
	function __construct(array $config)
	{
		$this->config = $config;
	}

    /**
     * 检查指定角色是否有权限访问特定的动作
     *
     * @param string $role
     * @param string $accessor
     *
     * @return boolean
     */
    function authorized($role, $accessor)
    {
    	if (empty($accessor)) return false;

        $default = $this->config['acl.default'];        
        $list = $this->config['acl.list'];

        if (!is_array($list))
        {
        	return self::EVERYONE === $default ? TRUE : FALSE;
        }
    	
        # 如果 accessor 在 角色 NOBODY中则直接返回false
		if ( !empty($list[self::NOBODY]) )
		{
			if ( in_array($accessor, $list[self::NOBODY]) )
        	{
        		return false;
        	}
		}
        
        # 如果 $accessor 在 角色 everyone中则直接返回true
		if ( !empty($list[self::EVERYONE]) )
		{
			if ( in_array($accessor, $list[self::EVERYONE]) )
        	{
        		return true;
        	}
		}
		
        if ( empty($role) )
        {
        	if ( !empty($list[self::NO_ROLE]) )
        	{
	        	if ( in_array($accessor, $list[self::NO_ROLE]) )
	        	{
	        		return true;
	        	}
        	}
        	if ( !empty($list[self::HAS_ROLE]) )
        	{
	        	if ( in_array($accessor, $list[self::HAS_ROLE]) )
	        	{
	        		return false;
	        	}
        	}
        }
        else
        {
            if ( $role == self::G_ALL ) return true;

        	if ( !empty($list[self::NO_ROLE]) )
        	{
	        	if ( in_array($accessor, $list[self::NO_ROLE]) )
	        	{
	        		return false;
	        	}
        	}
        	
        	if ( !empty($list[self::HAS_ROLE]) )
        	{
	        	if ( in_array($accessor, $list[self::HAS_ROLE]) )
	        	{
	        		return true;
	        	}
        	}
	        
        	if ( !empty($list[$role]) )
	        {
	        	if ( in_array($accessor, $list[$role]) )
	        	{
	        		return true;	
	        	}
	        }
        }
        
        return self::EVERYONE === $default ? TRUE : FALSE;
    }

    /**
     * 将用户数据保存到 session 中
     *
     * @param array $user
     * @param string $role
     */
    function change_user(array $user, $role)
    {
    	$acl_id = $this->config['acl.id'];
    	
        $user['role'] = $role;
        $_SESSION[$acl_id] = $user;
    }
    
    /**
     * 获取保存在 session 中的用户数据
     * 
     * @param string $data_key 属性
     * 
     * @return array|null 不存在时返回null
     */
    function user($data_key =null)
    {
    	$acl_id = $this->config['acl.id'];
    	
        if (!isset($_SESSION[$acl_id])){
            return null;
        }
        if (!empty($data_key)){
            return G::val($_SESSION[$acl_id], $data_key, '');
        }
        return $_SESSION[$acl_id];
    }

    /**
     * 获取 session 中用户信息包含的角色
     *
     * @return array
     */
    function user_role()
    {
        return $this->user('role');
    }

    /**
     * 判断是否登录
     *
     * @return array
     */
    function is_login()
    {
        $user = $this->user();
        return !empty($user);
    }
    
    /**
     * 从 session 中清除用户数据
     */
    function clean_user()
    {
    	$acl_id = $this->config['acl.id'];
        unset($_SESSION[$acl_id]);
    }
    
}
